package com.zuipin.service;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

import com.zuipin.entity.MemberAccount;
import com.zuipin.entity.MemberLevel;
import com.zuipin.entity.ThirdAccount;
import com.zuipin.enums.GrowthValType;
import com.zuipin.framework.exception.CustomException;
import com.zuipin.framework.result.Result;
import com.zuipin.util.Pagination;
import com.zuipin.vo.MemberAccountVo;
import com.zuipin.vo.MemberInfoVo;

/**
 * @ClassName: IMemberAccountService
 * @author wuyicheng
 * @time 2017年3月27日下午3:58:54
 */
public interface IMemberAccountService {
	
	public MemberAccount findById(Long id);
	
	public List<MemberAccount> findListByPage(MemberAccount memberAccount, Pagination page);
	
	public void insert(MemberAccount memberAccount);
	
	public void update(MemberAccount memberAccount);
	
	public void delete(MemberAccount memberAccount);
	
	/**
	 * @Title: findByMemberId
	 * @author: wuyicheng 
	 * @date: 2017年3月30日下午2:59:27 
	 * @param memberId 
	 * @return 
	 * @return: MemberAccount 
	 * @throws
	 */
	public MemberAccount findByMemberId(Long memberId);
	
	/**
	 * @Title: findByMemberIdAndSysId 
	 * @author: wuyicheng 
	 * @date: 2017年3月31日下午3:30:37 
	 * @param memberId
	 *  @param sysId 
	 * @ return @return: MemberAccount @throws
	 */
	public MemberAccount findByMemberAccount(MemberAccount memberAccount);
	
	public MemberAccountVo findByMemberAccount(Map<String, Object> map);
	
	public MemberInfoVo createMemberAccount(String memberAccount, String password, String referralCode, Long sysId);
	
	public void createMember(ThirdAccount thirdAccount);
	
	/**
	 * @throws ParseException
	 * @throws CustomException
	 * 			@param result @Title: doRegister @author: wuyicheng @date: 2017年4月24日下午7:03:48 @param loginName @param password @param sysId @return @return: Result<MemberInfoVo> @throws
	 */
	public Result<MemberInfoVo> doRegister(String loginName, String password, Long sysId, Result<MemberInfoVo> result, String device) throws CustomException, ParseException;
	
	/**
	 * @Title: doIsExist @author: wuyicheng @date: 2017年4月24日下午7:15:51 @param loginName @param sysId @param result @return @return: Result<Map<String,Object>> @throws
	 */
	public boolean doIsExist(String loginName, Long sysId);
	
	/**
	 * @throws ParseException
	 * @throws CustomException
	 * @Title: doLoginByPwd @author: wuyicheng @date: 2017年4月24日下午8:39:12 @param memberAccount @param password @param sysId @param result @return @return: Result<MemberInfoVo> @throws
	 */
	public Result<MemberInfoVo> doLoginByPwd(String memberAccount, String password, Long sysId, Result<MemberInfoVo> result, String device) throws CustomException, ParseException;
	
	/**
	 * @throws ParseException
	 * @throws CustomException
	 * @Title: doLoginBySms @author: wuyicheng @date: 2017年4月24日下午8:53:39 @param loginName @param sysId @param result @return @return: Result<MemberInfoVo> @throws
	 */
	public Result<MemberInfoVo> doLoginBySms(String loginName, Long sysId, Result<MemberInfoVo> result, String devic) throws CustomException, ParseException;
	
	/**
	 * @throws ParseException
	 * @throws CustomException
	 * 			@param result @Title: doLoginByThirdLogin @author: wuyicheng @date: 2017年4月24日下午9:01:19 @param openId @param platformId @param nickName @param sysId @return @return:
	 *             Result<MemberInfoVo> @throws
	 */
	public Result<MemberInfoVo> doLoginByThirdLogin(String openId, Long platformId, String nickName, Long sysId, String unionId, Result<MemberInfoVo> result, String device)
			throws CustomException, ParseException;
	
	/**
	 * @Title: findPwd @author: wuyicheng @date: 2017年4月24日下午9:30:55 @param memberAccount @param password @param sysId @param result @return @return: Result<Map<String,Object>> @throws
	 */
	public Result<Map<String, Object>> findPwd(String memberAccount, String password, Long sysId, Result<Map<String, Object>> result);
	
	/**
	 * @Title: updatePwd @author: wuyicheng @date: 2017年4月24日下午9:37:19 @param memberId @param sysId @param password @param newPwd @param result @return @return: Result<Map<String,Object>> @throws
	 */
	public Result<Map<String, Object>> updatePwd(Long memberId, Long sysId, String password, String newPwd, Result<Map<String, Object>> result);
	
	/**
	 * 根据会员ID和系统ID查询会员账号信息 @Title: findByMemberIdAndSysId @author: wuyicheng @date: 2017年4月25日下午7:13:35 @param memberId @param sysId @return @return: MemberAccount @throws
	 */
	MemberAccount findByMemberIdAndSysId(Long memberId, Long sysId);
	
	/**
	 * 是否绑定手机 @Title: isBindingMobilePhone @author: wuyicheng @date: 2017年4月26日下午7:01:42 @param memberId @return @return: boolean @throws
	 */
	public boolean isBindingMobilePhone(Long memberId);
	
	/**
	 * 根据会员ID和系统ID判断是否存在 
	 * @Title: doIsExist 
	 * @author: wuyicheng 
	 * @date: 2017年4月26日下午7:25:35 
	 * @param memberId 
	 * @param sysId 
	 * @return 
	 * @return: boolean 
	 * @throws
	 */
	boolean doIsExist(Long memberId, Long sysId);
	
	/**
	 * 根据会员集合和系统ID查询会员账号信息 
	 * @Title: findByMemberIdsAndSysId 
	 * @author: wuyicheng 
	 * @date: 2017年5月5日下午3:44:28 
	 * @param memberIds 
	 * @param sysId 
	 * @return 
	 * @return: List<MemberAccount> 
	 * @throws
	 */
	List<MemberAccount> findByMemberIdsAndSysId(List<Long> memberIds, Long sysId);
	
	/**
	 * @Description:根据unionId获取会员信息
	 * @Title:
	 * @author: xujinding
	 * @date: 2017年5月22日上午9:44:37
	 */
	public Result<MemberAccount> findMemberByUnionId(String unionId, Long sysId, Long platformId, Result<MemberAccount> result);
	
	/**
	 * @Title: pwdIsEquals 
	 * @author: wuyicheng 
	 * @date: 2017年5月24日上午9:43:22 
	 * @param oldPwd 
	 * @param newPwd 
	 * @return 
	 * @return: boolean 
	 * @throws
	 */
	boolean pwdIsEquals(String oldPwd, String newPwd);
	
	/**
	 * 更新消费金额、成长值 
	 * @Title: updateConsumption 
	 * @author: wuyicheng 
	 * @date: 2017年6月20日下午2:56:36 
	 * @param memberId 会员ID 
	 * @param sysId 系统ID 
	 * @param totalAmount 订单应付总金额（包含充值余额） 
	 * @param growthValue 成长值 
	 * @param isAdd
	 * 是否添加，true+ false- 
	 * @param remark 备注 
	 * @throws CustomException 
	 * @return: void @throws
	 */
	public void updateConsumption(Long memberId, Long sysId, BigDecimal totalAmount, Integer growthValue, boolean isAdd, String remark, String describes, String oddNumbers,
			Long sysUserId, GrowthValType growthValType) throws CustomException;
	
	/**
	 * 获取成长值 
	 * @Title: getGrowthValue 
	 * @author: wuyicheng 
	 * @date: 2017年6月20日上午10:44:56 
	 * @param actualPayTotalAmount 
	 * @param memberLevel 
	 * @ return 
	 * @return: Integer @throws
	 */
	public Integer getGrowthValue(BigDecimal actualPayTotalAmount, MemberLevel memberLevel);
	
	/**
	 * 查询接收方会员信息 
	 * @Title: searchSendMember 
	 * @author: wuyicheng 
	 * @date: 2017年7月10日下午3:15:06 
	 * @param searchMap 
	 * @return @return: List<Map<String,Object>> 
	 * @throws
	 */
	public List<Map<String, Object>> searchSendMember(Map<String, Object> searchMap);
	
	public void updateIntegral(Long id, Integer num);
	
	public void updateAmount(Long id, BigDecimal num);
	
	public MemberAccount findByMemberIdAndSysIdForUpdate(Long memberId, Long sysId);
	
	MemberAccount findByMemberAccountForUpdate(MemberAccount memberAccount);
	
	/**
	 * 过滤会员状态   不可用返回true 可用返回false
	  *  @Title: filterMemberStatus
	  * @author joy.zhang
	  * @date 2017年8月9日 下午2:18:20
	  * @param userAccount 会员账号
	  * @param result 错误信息
	  * @return
	  * @return boolean
	 */
	@SuppressWarnings("rawtypes")
	public boolean filterMemberStatus(MemberAccount userAccount, Result result);
	
	/**
	 * 过滤会员状态   不可用返回true 可用返回false
	  *  @Title: filterMemberStatus
	  * @author joy.zhang
	  * @date 2017年8月9日 下午2:44:07
	  * @param memberId 会员Id
	  * @param sysId 系统Id
	  * @param result 错误信息
	  * @return
	  * @return boolean
	 */
	@SuppressWarnings("rawtypes")
	public boolean filterMemberStatus(Long memberId, Long sysId, Result result);
}
